package com.huyi.common.annotation.aspect;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import com.huyi.common.annotation.Ds;
import com.huyi.common.datasource.DataSourceContextHolder;

/**
 * 设置数据源切面
 * 
 * @author shengli.hu
 */
@Aspect
@Order(-1) // 保证该AOP在@Transactional之前执行
@Component
public class DsAspect {

	protected static final Logger logger = LoggerFactory.getLogger(DsAspect.class);

	@Pointcut("@annotation(com.huyi.common.annotation.Ds)")
	public void doPointcut() {}

	/**
	 * 在切换数据源注解的方法之前执行
	 * 
	 * @see
	 */
	@Before("doPointcut()")
	public void beforeDsAspect(JoinPoint point) {
		MethodSignature signature = (MethodSignature) point.getSignature();
		Method method = signature.getMethod();
		Ds dataSource = method.getAnnotation(Ds.class);
		if (dataSource != null) {
			// 切换数据源
			DataSourceContextHolder.setDataSourceType(dataSource.value().name());
		}
	}

	/**
	 * 在切换数据源注解的方法之后执行
	 * 
	 * @see 
	 */
	@After("doPointcut()")
	public void afterDsAspect() {
		// 清除进程中数据源的名字
		DataSourceContextHolder.clearDataSourceType();
	}
}